//
//  LYDataBaseMigrationAction.h
//  Apps
//
//  Created by 李永彬 on 2019/6/5.
//  Copyright © 2019 appscomm. All rights reserved.
//

#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN

@class LYDatabase;
@interface LYDataBaseMigrationAction : NSObject

- (instancetype)initWithDatabase:(LYDatabase *)database;

//修改字段名
- (void)changeColumnsWithDic:(NSDictionary <NSDictionary *, NSDictionary *>*)changeDic migrateTableClass:(Class)tableClass error:(NSError * __autoreleasing *)error;

//添加字段名
- (void)addColumnsWithDic:(NSDictionary <NSString *, NSString *>*)columnsDic migrateTableClass:(Class)tableClass error:(NSError * __autoreleasing *)error;

//删除字段名
- (void)deleteColumnsWithArray:(NSArray *)columnsDelete migrateTableClass:(Class)tableClass error:(NSError * __autoreleasing *)error;


/**
 删除表

 @param tableClasses 表对应的Models的Classes
 @param error Error
 */
- (void)dropTableWithTableClasses:(NSArray <Class>*)tableClasses error:(NSError * __autoreleasing *)error;


/**
 自己迁移数据。具体执行过程是这样：比如迁移一个Model对象对应的t_Model表。
 1.先把旧的t_Model表修改表名成t_ModelMigrateTempTable
 2.用Model类创建一个新的表t_Model
 3.动态创建一个ModelMigrateTempTable类，
 4.用ModelMigrateTempTable类，用分页的方式，查询t_ModelMigrateTempTable里面的数据
 5.上一步中查出来的数据，在handler代码块经过整理运算生成NSArray <Model *>* 类型的数组
 6.把NSArray <Model *>* 插入到t_Model新表中
 7.根据dropOldTable执行是否删除旧表t_ModelMigrateTempTable
 
 @param tableClass 需要迁移的表对应的model
 @param pageSize 每页查询出多少数据
 @param dropOldTable 是否删除旧表（一般都传YES去删除旧表，有时候为了校验数据不想删除旧表，就可以传NO。最后也可以手动在completion中删除）
 @param handler 自定义的计算写在这里
 @param errorCapture 错误捕获
 @param progress 完成的进度
 @param completion 完成回调
 */
- (void)customRenewMigrateTableWithClass:(Class)tableClass pageSize:(NSInteger)pageSize dropOldTableWhenNoError:(BOOL)dropOldTable handler:(NSArray * _Nullable (^)(NSInteger page, NSArray <NSDictionary *>*originData))handler errorCapture:(void(^)(NSError *error, BOOL *needStop))errorCapture progress:(void(^)(NSProgress *completeProgress))progress completion:(void(^)(void))completion ;

@end

NS_ASSUME_NONNULL_END
